package collection_try;

import java.util.LinkedHashMap;
import java.util.Map;

public class MapLinkedHashTest<K,V> extends LinkedHashMap<K,V> {
    private final int cacheSize;

    public MapLinkedHashTest(int cacheSize) {
        // 第三个参数true表示按照访问顺序排序，false表示按照插入顺序排序
        // 在这里我们需要FIFO，所以传入false，但在removeEldestEntry中会维护大小，因此顺序本身不影响FIFO逻辑
        super(cacheSize,0.75f,true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//        该方法的作用是告诉Map是否要删除“最老”的Entry
        return size() > cacheSize;
    }

    public static void main(String[] args) {
        MapLinkedHashTest<String,Integer> map = new MapLinkedHashTest<>(3);
        map.put("one",1);
        map.put("two",2);
        map.put("three",3);
        System.out.println(map);
        map.put("four",4);
        System.out.println(map);

        LinkedHashMap<String,Integer> linkMap = new LinkedHashMap<>(16, 0.75f, true); //true为访问顺序，false为插入顺序
        linkMap.put("monday",1);
        linkMap.put("tuesday",2);
        linkMap.put("wednesday",3);
        linkMap.put("thursday",4);
        linkMap.put("friday",5);
        System.out.println(linkMap);
        System.out.println(linkMap.get("monday")); //在访问顺序模式下，每次调用 get 或 put 方法时，相应的条目都会被移动到链表的末尾，表示它是最近访问的。
        System.out.println(linkMap);

        LinkedHashMap<String,Integer> linkMap1 = new LinkedHashMap<>(16, 0.75f, false); //true为访问顺序，false为插入顺序
        linkMap1.put("january",1);
        linkMap1.put("february",2);
        linkMap1.put("march",3);
        linkMap1.put("april",4);
        linkMap1.put("may",5);
        System.out.println(linkMap1);
        System.out.println(linkMap1.get("january"));
        System.out.println(linkMap1);
    }
}
